from django.shortcuts import render

# Create your views here.
from rest_framework import status
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_jwt.settings import api_settings

from oauth.exceptions import OauthQQError
from oauth.serializers import OauthQQUserSerializer
from .models import OauthQQUser

from oauth.utils import OAuthQQ


class OAuthURLView(APIView):
    """用来获取qq登录页面的网址
    1.接收的参数?　　用户登录成功之后返回的页面地址ｎｅｘｔ
    2.返回的参数?   ｑｑ登录网址　　
    get　auth/qq/authorizatio/?next=
    """

    def get(self, request):
        # next用户可以不传
        next = request.query_params.get('next')
        # 拼接url地址，将ｎｅｘｔ作为state参数返回，用户访问这个url会带上state参数给qq服务器,后面
        # 还需要接收access_token和openid,所以将这种第三方的工具封装在独立的方法中,需要的时候调用
        oauth = OAuthQQ()
        login_url = oauth.get_login_url(state=next)
        return Response({"login_url": login_url})


class OAuthQQUserView(CreateAPIView):
    """向qq请求获取openid
    1.接收前端发过来的code   get /oauth/qq/user/?code=
    2.校验
    3.向qq请求access_token
    4.向qq请求openid
    5.查询数据库中是否有这个openid  如果有 说明已经绑定了用户 直接返回token 如果没有 返回openid(加密之后的)
    """
    # 绑定用户需要用到的serializer_class
    serializer_class = OauthQQUserSerializer

    def get(self, request):
        code = self.request.query_params.get('code')
        if not code:
            return Response({'message': '缺少code'}, status=status.HTTP_400_BAD_REQUEST)

        # 向qq发送请求,请求access_token  封装到qq接口中
        oauth = OAuthQQ()
        try:  # qq接口中抛出了异常  在这里要进行捕获
            access_token = oauth.get_access_token(code)
            openid = oauth.get_openid(access_token)
        except OauthQQError as e:
            return Response({'message': 'QQ服务异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
        # 判断用户是否存在
        try:
            qquser = OauthQQUser.objects.get(openid=openid)
        except Exception as e:
            # 如果没查到用户 说明是第一次登录 将openid返回给前端 作为下一次绑定的token校验
            user_access_token = OAuthQQ.generate_user_access_token(openid)
            return Response({"access_token": user_access_token})
        else:
            # 查到了用户数据  说明用户绑定了qq
            user = qquser.user
            # 生成jwt_token
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            data = {
                "user_id": user.id,
                "username": user.username,
                "token": token
            }

            return Response(data)

            # def post(self, requset):
            #     """第一次使用qq登录的用户进行绑定
            #     1.接收参数 mobile  sms  token  密码
            #     2.校验参数  使用序列化器   先校验token  再校验短信验证码
            #     3.如果用户存在(输入的手机号能查找到用户 &密码验证正确)  直接绑定user和openid(在token中
            #         需要使用itsdangerous的校验功能 loads
            #     4.如果用户不存在  创建用户 并绑定openid
            #     5.返回user和token
            #     6.分析可知  此接口中会用到序列化器的校验和保存功能  所以直接继承caw
            #     """
            # pass
